在我们之前的示例中,我们将“网格”定义为三个断开连接的点。虽然这对于表示“点云”很有用,但如果我们想创建表面,则必须描述网格的连接性。为此,让我们定义一个由三个点组成的单个单元,顺序与我们之前定义的相同。
>>> cells = [3, 0, 1, 2]
注意
观察我们如何必须插入前导 3 以告诉 VTK 我们的面由三个元素描述,在这种情况下,三个点。在我们的 PolyData 中,VTK 不假设面总是包含三个点,因此我们必须定义它。这实际上让我们可以灵活地根据需要定义每个单元尽可能多(或尽可能少至一个)的点。
注意
所有单元类型遵循相同的连接性数组格式:
[点的数量,点 1,点 2,...]
多面体类型除外,其中我们需要定义单元的每一面。此类型的格式如下:
[元素数量,面数量,面1点数,点1,点2,...,点N,面2点数,...]。
其中元素数量是描述此单元的数组中的总元素数。
现在我们已经拥有了组装包含单个三角形的 PolyData 实例的所有必要部分。为此,我们只需将点以及单元提供给 PolyData 的构造函数。我们可以从表示中看到此几何包含三个点和一个单元
>>> mesh = pv.PolyData(points, cells)
>>> mesh
让我们也绘制它:
mesh = pv.PolyData(points, [3, 0, 1, 2])
mesh.plot(cpos='xy', show_edges=True)
与此同时,让我们注释此图以描述此网格。
pl = pv.Plotter()
pl.add_mesh(mesh, show_edges=True, line_width=5)
label_coords = mesh.points + [0, 0, 0.01]
pl.add_point_labels(
label_coords,
[f'Point {i}' for i in range(3)],
font_size=20,
point_size=20,
always_visible=True,
)
pl.add_point_labels([0.43, 0.2, 0], ['Cell 0'], font_size=20)
pl.camera_position = 'xy'
pl.show()
您可以清楚地看到多边形是如何基于点的连接性创建的。
此实例有几个属性来访问网格的底层数据。例如,如果您希望访问或修改网格的点,只需使用 points 访问 points 属性。
>>> mesh.points
pyvista_ndarray([[0. , 0. , 0. ],
[1. , 0. , 0. ],
[0.5 , 0.667, 0. ]])
连接性也可以从 faces 属性访问:
>>> mesh.faces
array([3, 0, 1, 2])
或者我们可以简单地通过以下方式获取网格的表示:
>>> mesh
在此表示中我们看到:
这与 VTK 的输出大不相同。请参阅对象表示以比较两个表示。
此网格不包含数据数组,因为它仅由几何组成。这使得它对于仅绘制网格的几何很有用,但数据集通常包含不止几何的内容。例如:
虽然这些数据集中的每一个都可以表示为不同的几何类,但它们都包含点、单元或字段数据,解释几何中某个位置的数据值。